if ( !window.controller ) throw new Error( '"controller" not initialized' );
if ( !controller.Description ) {

	controller.Description = new (function(){
		var Description = function(){
			// Статы	
			this.stat = 
			{1 : {n : "Здоровье"}, 2 : {n : "Сила"}, 3 : {n : "Ловкость"}, 4 : {n : "Выносливость"}, 5 : {n : "Реакция"}}
			this.property = 
			{
				1 : {n : "Востановить уровень жизни", 		conv: ""},
				2 : {n : "Максимальное количество жизни", 	conv: "HP"},
				3 : {n : "Ускорение регенерации жизни", 	conv: "сек."},
				4 : {n : "Передвижение по локациям", 		conv: ""},
				5 : {n : "Передвижение по локациям MAX", 	conv: ""},
				6 : {n : "Ускорение передвижения по локациям", conv: "сек."},
				7 : {n : "Увеличение получаемого опыта", 	conv: "%"},
				8 : {n : "Здоровье", 						conv: ""},
				9 : {n : "Атака", 							conv: ""},
				10: {n : "Броня", 							conv: ""},
				11: {n : "Количество бизнесс точек", 		conv: ""},
				12: {n : "Деловая активность", 				conv: ""},
				13: {n : "Кентов в банде", 					conv: ""},
				14: {n : "Шанс крита", 						conv: ""},
				15: {n : "Шанс увернуться от удара", 		conv: ""},
				16: {n : "Шанс защиты от крита", 			conv: ""},
				17: {n : "Шанс попасть", 					conv: ""},
				18: {n : "Защищенная сумма от грабежа",		conv: ""},
				19: {n : "Мощность урона", 					conv: ""},
				20: {n : "Мощность брони", 					conv: ""},
				21: {n : "", 								conv: ""},
				22: {n : "", 								conv: ""},
				23: {n : "", 								conv: ""},
				24: {n : "", 								conv: ""},
				25: {n : "", 								conv: ""},
				26: {n : "", 								conv: ""},
				27: {n : "", 								conv: ""},
				28: {n : "", 								conv: ""},
				29: {n : "", 								conv: ""},
				30: {n : "Доход с бизнеса", 				conv: "%"},
				31: {n : "Доход при победе 1 на 1", 		conv: "%"},
				32: {n : "Доход при ограблении бизнеса", 	conv: "%"},
				33: {n : "", 								conv: ""},
				34: {n : "Отрравление противника", 			conv: "HP"},
				35: {n : "Снимает эффект отравления", 		conv: ""},
				36: {n : "Восстановление жизни", 			conv: ""},
				37: {n : "Возврат урона атакующему", 		conv: "%"},
				38: {n : "Восстанавливает здоровье пропуская ход", conv: "%"},
				39: {n : "Пропуск хода и след удар с увеличеным уроном", 	conv: ""},
				40: {n : "", 								conv: ""},
				41: {n : "Сет из", 							conv: "ударов"},
				42: {n : "", 								conv: ""},
				43: {n : "Шанс убить противника если его HP меньше", 	conv: "%"},
				44: {n : "Сила критического удара", 		conv: "%"},
				45: {n : "Защита от критического урона", 	conv: "%"},
				46: {n : "Вероятность сработать в бою", 	conv: "%"},
				47: {n : "Уровень энергии", 				conv: ""},
				48: {n : "Максимальный запас энергии", 		conv: ""},
				49: {n : "Ускорение регенерации энерегии", 	conv: "сек"},
				50: {n : "Уровень производящей профессии", 	conv: ""},
				51: {n : "Уровень добывающей профессии", 	conv: ""},
				52: {n : "Доход при ограблении бизнеса", 	conv: "%"},

				53: {n : "Вы находитесь в патруле", 		conv: ""},
				54: {n : "Максимальное количество активных патрулей", 	conv: ""},
				55: {n : "Выход из патруля", 				conv: ""},

				56: {n : "Реестровый номер района", 		conv: ""},
				57: {n : "Везение", 						conv: "%"},
				58: {n : "Время патруля", 					conv: " мин."}

			};

			// Валюты
			this.curr = 
			{1 : {n : "Баксы"}, 2 : {n : "Брилианты"}, 3 : {n : "Очки навыков"},4 : {n : "Очки характиеристик"}, 5 : {n : "CRP"} };
			// Инвентари
			this.invCat = 
			{
				1:{n: "Экипировка", d: true},
				2:{n: "Приемы", d:false},
				3:{n: "Допинг", d:false},
				4:{n: "Ресурсы", d:false},
				5:{n: "Встройки", d:false}
			}
			this.invSlots = 
			{
				1  : {n:""},
				2  : {n:""},
				3  : {n:""},
				4  : {n:""},
				5  : {n:""},
				6  : {n:""},
				7  : {n:""},
				8  : {n:""},
				9  : {n:""},
				10 : {n:""}
			}

		}
		var DescriptionPrototype 		= Description.prototype;
		
		DescriptionPrototype.LocationType = 
			{
				world 	: {n:"Город", p: false}, 				// Верхушка айзберга
				location: {n:"Локация", p: false}, 			// Локация 
				port 	: {n:"Перемещение", p: true},		
				objport : {n:"Здания", p:true },	
				npc 	: {n:"Персонажи", p: true},
				control : {n:"Управляющая контроллером локация", p: false}
			};
		
		
		
		DescriptionPrototype.getDescList = function(descArr){
			if(this[descArr]){
				return this[descArr];

			}else{
				throw new Error(descArr + "Not defined in description list");
			}
		}
		DescriptionPrototype.getDesc = function(descArr, key){
			if(this[descArr]){
				if(this[descArr][key]){
					return this[descArr][key];
				}else{
					throw new Error("key " + key + " Not defined in description list ["+ descArr +"]");
				}
			}else{
				throw new Error(descArr + " Not defined in description list");
			}
		}
		
		DescriptionPrototype.location = new Object();
		DescriptionPrototype.getLocation = function(loc_id){
			if(this.location[loc_id]){
				return this.location[loc_id];
			}
			return null;
			
		}
		
		
		DescriptionPrototype.setLocation = function(loc){
			if(loc.parents){
				for(var i in loc.parents){
					this.setLocation(loc.parents[i]);
				}
			}
			this.location[loc.id] = loc;

			this.location[loc.id].action_param = jQuery.parseJSON(loc.action_param);
			this.location[loc.id].visual_param = jQuery.parseJSON(loc.visual_param);

		}
		
		
		
		DescriptionPrototype.dateFormat = function(timestamp, format) {
			format = typeof(format) == 'undefined' ? 'datetime' : format;

			var date = new Date(timestamp*1000);

			var d = date.getDate().toString();
			var m = (date.getMonth() + 1).toString();
			var y = date.getFullYear().toString();

			var h = date.getHours().toString();
			var i = date.getMinutes().toString();
			var s = date.getSeconds().toString();

			if (i < 10) i = "0"+i;
			if (s < 10) s = "0"+s;
			if (d < 10) d = "0"+d;
			if (m < 10) m = "0"+m;

			var result = '';
			switch (format) {
				default:
				case 'datetime':
					result = d+"."+m+"."+y+" "+h+":"+i+":"+s;
					break;
				case 'time':
					result = h+":"+i+":"+s;
					break;
				case 'date':
					result = m+"/"+d+"/"+y.substring(2);
					break;
				case 'raw':
					result = {
						day: d,
						month: m,
						year: y,
						hours: h,
						minutes: i,
						seconds: s
					};
					break;
			}

			return result;
		}

		DescriptionPrototype.durationFormat = function(secondsLast, type) {
			var hours   = Math.floor(secondsLast / 3600).toString();
			var minutes = Math.floor(secondsLast % 3600 / 60).toString();
			var seconds = Math.floor(secondsLast % 60).toString();

			type = type || 0;
			if (type == 0) {

				while (hours.length < 2) {
					hours = '0' + hours;
				}
				
				while (minutes.length < 2) {
					minutes = '0' + minutes;
				}

				while (seconds.length < 2) {
					seconds = '0' + seconds;
				}
				
				return hours + ':' + minutes + ':' + seconds; 
			} else if (type == 1) {
				var ret = '';
				if (parseInt(hours) > 0) ret = hours.toString()+'час.';
				
				if (parseInt(minutes)) {
					if (seconds >= 30) minutes++;
					ret += (hours?' ':'') + minutes.toString() + 'мин.';
				}
				
				if (!parseInt(hours) && !parseInt(minutes) && parseInt(seconds)) ret = seconds.toString() + 'сек';
				return ret;
			} else {
				return '0:00:00';
			}
		}


		return Description;
	}());
}